JavaScript FormData 객체를 중첩 객체로 변환하기 - 심화
작성일 : 2025.03.12
웹 애플리케이션에서 폼 데이터를 처리할 때는 단순히 값을 추출하는 것보다 더 복잡한 작업이 필요한 경우가 많습니다. 특히 대시보드, 차트 라이브러리, 설정 패널 등을 다룰 때는 HTML 폼의 평면적인 이름-값 쌍을 중첩된 구조의 설정 객체로 변환해야 하는 경우가 많습니다. 이 글에서는 FormData 객체를 복잡한 중첩 구조를 가진 JavaScript 객체로 변환하는 효과적인 방법을 알아보겠습니다.
기본 개념: FormData와 중첩 객체
HTML 폼에서 제출된 데이터는 FormData 객체로 쉽게 수집할 수 있습니다. 하지만 FormData는 기본적으로 평면적인 키-값 쌍의 집합입니다. 예를 들어:
<form id="chartForm">
<input name="title.text" value="차트 제목">
<input name="xAxis.title.text" value="X축 제목">
<input name="yAxis.title.text" value="Y축 제목">
</form>
위 폼에서 수집한 FormData는 다음과 같은 평면적인 구조를 갖습니다:
"title.text" => "차트 제목"
"xAxis.title.text" => "X축 제목"
"yAxis.title.text" => "Y축 제목"
그러나 많은 JavaScript 라이브러리(특히 차트 라이브러리)는 다음과 같은 중첩된 구조의 설정 객체를 기대합니다:
{
title: {
text: "차트 제목"
},
xAxis: {
title: {
text: "X축 제목"
}
},
yAxis: {
title: {
text: "Y축 제목"
}
}
}
이러한 변환을 효율적으로 처리하는 방법을 살펴보겠습니다.
FormData를 중첩 객체로 변환하는 방법
1. 중첩 속성 처리하기
점 표기법(dot notation)을 해석하여 중첩 객체를 생성하는 핵심 함수입니다:
function setNestedValue(obj, path, value) {
const parts = path.split(".");
let current = obj;
// 마지막 부분을 제외한 모든 부분에 대해 객체 구조 생성
for (let i = 0; i < parts.length - 1; i++) {
const part = parts[i];
if (!current[part]) current[part] = {};
current = current[part];
}
// 마지막 부분에 실제 값 할당
current[parts[parts.length - 1]] = value;
}
이 함수는 "xAxis.title.text"와 같은 경로를 받아 적절한 중첩 구조를 생성하고 최종 값을 설정합니다.
2. FormData 순회 및 변환
FormData의 모든 항목을 순회하면서 중첩 객체로 변환합니다:
function formDataToObject(formData) {
const result = {};
for (const [key, value] of formData.entries()) {
if (key.includes(".")) {
// 점이 있는 키는 중첩 속성으로 처리
setNestedValue(result, key, value);
} else {
// 단순 키는 직접 할당
result[key] = value;
}
}
return result;
}
특수 경우 처리하기
실제 애플리케이션에서는 단순히 점 표기법을 객체로 변환하는 것보다 더 복잡한 요구사항이 있을 수 있습니다.
1. 체크박스 값 처리
체크박스의 경우 FormData에서는 보통 "on" 값으로 전달되지만, 실제로는 true/false 값이 필요합니다:
if (value === "on") {
const checkbox = document.querySelector(`[name="${key}"]`);
if (checkbox && checkbox.type === "checkbox") {
value = checkbox.checked ? "true" : "false";
}
}